// // 加法、减法、乘法的同余原理
// // 不包括除法，因为除法必须求逆元，后续课讲述

#include <bits/stdc++.h>

using namespace std;

// 由于 C++ 没有大整数的类，所以这个不好进行测试

// 计算 ((a + b) * (c - d) + (a * c - b * d)) % mod 的非负结果
int f1(int a, int b, int c, int d, int mod)
{
    long long o1 = a;  // a
    long long o2 = b;  // b
    long long o3 = c;  // c
    long long o4 = d;  // d
    long long o5 = o1 + o2;  // a + b
    long long o6 = (o3 - o4 + mod) % mod;  // c - d
    long long o7 = (o1 * o3) % mod;  // a * c
    long long o8 = (o2 * o4) % mod;  // b * d
    long long o9 = (o5 * o6) % mod;  // (a + b) * (c - d)
    long long o10 = (o7 - o8 + mod) % mod;  // (a * c - b * d)
    long long o11 = (o9 + o10) % mod;  // ((a + b) * (c - d) + (a * c - b * d))
    long long o12 = (o11 + mod) % mod;  // ((a + b) * (c - d) + (a * c - b * d)) % mod
    // 如果是负数那么+mod返回
    if (o12 < 0)
        return static_cast<int>(o12 + mod);
    else  // 如果不是负数直接返回
        return static_cast<int>(o12);
}

// 计算 ((a + b) * (c - d) + (a * c - b * d)) % mod 的非负结果
int f2(int a, int b, int c, int d, int mod)
{
    int o1 = a % mod; // a
    int o2 = b % mod; // b
    int o3 = c % mod; // c
    int o4 = d % mod; // d
    int o5 = (o1 + o2) % mod; // a + b
    int o6 = (o3 - o4 + mod) % mod; // c - d
    int o7 = (1LL * o1 * o3) % mod; // a * c
    int o8 = (1LL * o2 * o4) % mod; // b * d
    int o9 = (1LL * o5 * o6) % mod; // (a + b) * (c - d)
    int o10 = (o7 - o8 + mod) % mod; // (a * c - b * d)
    int ans = (o9 + o10) % mod; // ((a + b) * (c - d) + (a * c - b * d)) % mod
    return ans;
}

int main()
{
    srand(time(nullptr));
    std::cout << "测试开始" << std::endl;
    int testTime = 100000;
    int mod = 1000000007;
    for (int i = 0; i < testTime; i++)
    {
        long long a = rand();
        long long b = rand();
        long long c = rand();
        long long d = rand();
        if (f1(a, b, c, d, mod) != f2(a, b, c, d, mod))
        {
            std::cout << "出错了!" << std::endl;
        }
    }
    std::cout << "测试结束" << std::endl;

    std::cout << "===" << std::endl;
    long long a = rand();
    long long b = rand();
    long long c = rand();
    long long d = rand();
    std::cout << "a : " << a << std::endl;
    std::cout << "b : " << b << std::endl;
    std::cout << "c : " << c << std::endl;
    std::cout << "d : " << d << std::endl;
    std::cout << "===" << std::endl;
    std::cout << "f1 : " << f1(a, b, c, d, mod) << std::endl;
    std::cout << "f2 : " << f2(a, b, c, d, mod) << std::endl;

    return 0;
}